package com.cskaoyan.javase.oop1._14access._3why;

/**
 * @description: 为什么使用访问权限修饰符?
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

import java.util.Arrays;

/**
 * 给成员和类加上访问权限,就相当于给房子加锁,没有钥匙(没有访问权限)就进不去(访问不到)
 * 但是房子的锁是可以撬开,是可以强行打破的,同样的访问权限符也不是绝对不可破解的
 * 比如Java自身就提供了反射的特性,反射是可以破解访问权限的,在反射面前,一切隐私都无可遁形
 * 既然这样,访问权限修饰符就是可以破解的,那么访问权限就具有了一些别的涵义:
 *      就和给门加锁,警告不要逾越界限一样,给类和成员加访问权限也有警示和暗示的意思,告诉代码的使用者
 *      哪里可以触碰(public),哪些不能触碰(private或者其他的访问权限)
 *      这在java是非常重要的设计原则
 * 这就意味着代码的使用者,应该关心代码中public和有访问权限的部分,而不应该关心private和没有权限的部分
 * 对于代码的书写者而言，隐藏代码的具体实现细节，可以很方便的修改代码实现
 *
 * 具体的案例:
 *      1.工具类的案例:
 *          工具类中的所有方法都是static修饰的,调用方法都是直接用类名点访问,完全不需要创建对象
 *          既然不需要对象,那就干脆不要创建对象,直接把这个功能去掉
 *          ---> 私有化构造器
 *      2.在设计一个类时,总有一些方法需要提供外接访问,这种方法应该使用public修饰
 *          但是总有一些方法不需要提供给外界访问,而是作为实现public方法的中间方法
 *          这些中间方法不希望给外界看,也没有看的必要,应该私有化它们
 *
 *      3.工厂的设计模式,指的是创建对象不通过自身的构造器,而是通过"工厂"去创建
 *          自身的构造器必须要私用,然后在"工厂"中创建它的对象
 *
 * 以上,使用访问权限修饰对于对于代码的书写者而言，隐藏代码的具体实现细节，可以很方便的修改代码实现
 *      而对于代码的使用者,要明确哪里可以触碰,哪里不要关心
 *
 */
public class Demo {
    public static void main(String[] args) {
        //A a = new A();
        //Arrays
    }
    public static void test(){
        test2();
    }

    //Access can be private
    private static void test2() {
        test3();
    }

    //Access can be private
    private static void test3() {
    }

}

class A{
    private A() {
    }
}
class AInstanceFactory{
    /*public static A getAInstance(){
        //return new A();
        //常见的手段就是反射获取A的对象
    }*/
}
